{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ['CUDA_VISIBLE_DEVICES'] = '2'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "/home/husein/.local/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "\n",
    "with open('train-test.json') as fopen:\n",
    "    dataset = json.load(fopen)\n",
    "    \n",
    "with open('dictionary.json') as fopen:\n",
    "    dictionary = json.load(fopen)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_X = dataset['train_X']\n",
    "train_Y = dataset['train_Y']\n",
    "test_X = dataset['test_X']\n",
    "test_Y = dataset['test_Y']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['from', 'to'])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dictionary.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "dictionary_from = dictionary['from']['dictionary']\n",
    "rev_dictionary_from = dictionary['from']['rev_dictionary']\n",
    "\n",
    "dictionary_to = dictionary['to']['dictionary']\n",
    "rev_dictionary_to = dictionary['to']['rev_dictionary']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "GO = dictionary_from['GO']\n",
    "PAD = dictionary_from['PAD']\n",
    "EOS = dictionary_from['EOS']\n",
    "UNK = dictionary_from['UNK']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Rachel Pike : The science behind a climate headline EOS'"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for i in range(len(train_X)):\n",
    "    train_X[i] += ' EOS'\n",
    "    \n",
    "train_X[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'How can I speak in <NUM> minutes about the bonds of women over three generations , about how the astonishing strength of those bonds took hold in the life of a four - year - old girl huddled with her young sister , her mother and her grandmother for five days and nights in a small boat in the China Sea more than <NUM> years ago , bonds that took hold in the life of that small girl and never let go - - that small girl now living in San Francisco and speaking to you today ? EOS'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for i in range(len(test_X)):\n",
    "    test_X[i] += ' EOS'\n",
    "    \n",
    "test_X[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def pad_second_dim(x, desired_size):\n",
    "    padding = tf.tile([[[0.0]]], tf.stack([tf.shape(x)[0], desired_size - tf.shape(x)[1], tf.shape(x)[2]], 0))\n",
    "    return tf.concat([x, padding], 1)\n",
    "\n",
    "class Translator:\n",
    "    def __init__(self, size_layer, num_layers, embedded_size,\n",
    "                 from_dict_size, to_dict_size, learning_rate, batch_size):\n",
    "        \n",
    "        def cells(size_layer = size_layer, reuse=False):\n",
    "            return tf.nn.rnn_cell.BasicRNNCell(size_layer,reuse=reuse)\n",
    "        \n",
    "        self.X = tf.placeholder(tf.int32, [None, None])\n",
    "        self.Y = tf.placeholder(tf.int32, [None, None])\n",
    "        self.X_seq_len = tf.count_nonzero(self.X, 1, dtype=tf.int32)\n",
    "        self.Y_seq_len = tf.count_nonzero(self.Y, 1, dtype=tf.int32)\n",
    "        batch_size = tf.shape(self.X)[0]\n",
    "        \n",
    "        encoder_embedding = tf.Variable(tf.random_uniform([from_dict_size, embedded_size], -1, 1))\n",
    "        decoder_embedding = tf.Variable(tf.random_uniform([to_dict_size, embedded_size], -1, 1))\n",
    "        \n",
    "        encoder_embedded = tf.nn.embedding_lookup(encoder_embedding, self.X)\n",
    "        \n",
    "        for n in range(num_layers):\n",
    "            (out_fw, out_bw), (state_fw, state_bw) = tf.nn.bidirectional_dynamic_rnn(\n",
    "                cell_fw = cells(size_layer // 2),\n",
    "                cell_bw = cells(size_layer // 2),\n",
    "                inputs = encoder_embedded,\n",
    "                sequence_length = self.X_seq_len,\n",
    "                dtype = tf.float32,\n",
    "                scope = 'bidirectional_rnn_%d'%(n))\n",
    "            encoder_embedded = tf.concat((out_fw, out_bw), 2)\n",
    "        \n",
    "        bi_state = tf.concat((state_fw, state_bw), -1)\n",
    "        encoder_state = tuple([bi_state] * num_layers)\n",
    "        \n",
    "        main = tf.strided_slice(self.Y, [0, 0], [batch_size, -1], [1, 1])\n",
    "        decoder_input = tf.concat([tf.fill([batch_size, 1], GO), main], 1)\n",
    "        dense = tf.layers.Dense(to_dict_size)\n",
    "        decoder_cells = tf.nn.rnn_cell.MultiRNNCell([cells() for _ in range(num_layers)])\n",
    "        \n",
    "        training_helper = tf.contrib.seq2seq.TrainingHelper(\n",
    "                inputs = tf.nn.embedding_lookup(decoder_embedding, decoder_input),\n",
    "                sequence_length = self.Y_seq_len,\n",
    "                time_major = False)\n",
    "        training_decoder = tf.contrib.seq2seq.BasicDecoder(\n",
    "                cell = decoder_cells,\n",
    "                helper = training_helper,\n",
    "                initial_state = encoder_state,\n",
    "                output_layer = dense)\n",
    "        training_decoder_output, _, _ = tf.contrib.seq2seq.dynamic_decode(\n",
    "                decoder = training_decoder,\n",
    "                impute_finished = True,\n",
    "                maximum_iterations = tf.reduce_max(self.Y_seq_len))\n",
    "        self.training_logits = training_decoder_output.rnn_output\n",
    "        \n",
    "        predicting_helper = tf.contrib.seq2seq.GreedyEmbeddingHelper(\n",
    "                embedding = decoder_embedding,\n",
    "                start_tokens = tf.tile(tf.constant([GO], dtype=tf.int32), [batch_size]),\n",
    "                end_token = EOS)\n",
    "        predicting_decoder = tf.contrib.seq2seq.BasicDecoder(\n",
    "                cell = decoder_cells,\n",
    "                helper = predicting_helper,\n",
    "                initial_state = encoder_state,\n",
    "                output_layer = dense)\n",
    "        predicting_decoder_output, _, _ = tf.contrib.seq2seq.dynamic_decode(\n",
    "                decoder = predicting_decoder,\n",
    "                impute_finished = True,\n",
    "                maximum_iterations = 2 * tf.reduce_max(self.X_seq_len))\n",
    "        self.predicting_ids = predicting_decoder_output.sample_id\n",
    "        \n",
    "        masks = tf.sequence_mask(self.Y_seq_len, tf.reduce_max(self.Y_seq_len), dtype=tf.float32)\n",
    "        self.cost = tf.contrib.seq2seq.sequence_loss(logits = self.training_logits,\n",
    "                                                     targets = self.Y,\n",
    "                                                     weights = masks)\n",
    "        self.optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(self.cost)\n",
    "        y_t = tf.argmax(self.training_logits,axis=2)\n",
    "        y_t = tf.cast(y_t, tf.int32)\n",
    "        self.prediction = tf.boolean_mask(y_t, masks)\n",
    "        mask_label = tf.boolean_mask(self.Y, masks)\n",
    "        correct_pred = tf.equal(self.prediction, mask_label)\n",
    "        correct_index = tf.cast(correct_pred, tf.float32)\n",
    "        self.accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "size_layer = 512\n",
    "num_layers = 2\n",
    "embedded_size = 256\n",
    "learning_rate = 1e-3\n",
    "batch_size = 128\n",
    "epoch = 20"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "W0902 18:04:46.335828 140274138560320 deprecation.py:323] From <ipython-input-16-065cbf9667dc>:30: bidirectional_dynamic_rnn (from tensorflow.python.ops.rnn) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `keras.layers.Bidirectional(keras.layers.RNN(cell))`, which is equivalent to this API\n",
      "W0902 18:04:46.336991 140274138560320 deprecation.py:323] From /home/husein/.local/lib/python3.6/site-packages/tensorflow/python/ops/rnn.py:464: dynamic_rnn (from tensorflow.python.ops.rnn) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `keras.layers.RNN(cell)`, which is equivalent to this API\n",
      "W0902 18:04:46.427003 140274138560320 deprecation.py:506] From /home/husein/.local/lib/python3.6/site-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Call initializer instance with the dtype argument instead of passing it to the constructor\n",
      "W0902 18:04:46.437997 140274138560320 deprecation.py:506] From /home/husein/.local/lib/python3.6/site-packages/tensorflow/python/ops/rnn_cell_impl.py:459: calling Zeros.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Call initializer instance with the dtype argument instead of passing it to the constructor\n",
      "W0902 18:04:46.560415 140274138560320 deprecation.py:323] From /home/husein/.local/lib/python3.6/site-packages/tensorflow/python/ops/rnn.py:244: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
      "W0902 18:04:46.946606 140274138560320 deprecation.py:323] From <ipython-input-16-065cbf9667dc>:39: MultiRNNCell.__init__ (from tensorflow.python.ops.rnn_cell_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "This class is equivalent as tf.keras.layers.StackedRNNCells, and will be replaced by that in Tensorflow 2.0.\n",
      "W0902 18:04:47.630460 140274138560320 lazy_loader.py:50] \n",
      "The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
      "For more information, please see:\n",
      "  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
      "  * https://github.com/tensorflow/addons\n",
      "  * https://github.com/tensorflow/io (for I/O related ops)\n",
      "If you depend on functionality not listed there, please file an issue.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "tf.reset_default_graph()\n",
    "sess = tf.InteractiveSession()\n",
    "model = Translator(size_layer, num_layers, embedded_size, len(dictionary_from), \n",
    "                len(dictionary_to), learning_rate,batch_size)\n",
    "sess.run(tf.global_variables_initializer())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "def str_idx(corpus, dic):\n",
    "    X = []\n",
    "    for i in corpus:\n",
    "        ints = []\n",
    "        for k in i.split():\n",
    "            ints.append(dic.get(k,UNK))\n",
    "        X.append(ints)\n",
    "    return X\n",
    "\n",
    "def pad_sentence_batch(sentence_batch, pad_int):\n",
    "    padded_seqs = []\n",
    "    seq_lens = []\n",
    "    max_sentence_len = max([len(sentence) for sentence in sentence_batch])\n",
    "    for sentence in sentence_batch:\n",
    "        padded_seqs.append(sentence + [pad_int] * (max_sentence_len - len(sentence)))\n",
    "        seq_lens.append(len(sentence))\n",
    "    return padded_seqs, seq_lens"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_X = str_idx(train_X, dictionary_from)\n",
    "test_X = str_idx(test_X, dictionary_from)\n",
    "train_Y = str_idx(train_Y, dictionary_to)\n",
    "test_Y = str_idx(test_Y, dictionary_to)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:36<00:00,  2.28it/s, accuracy=0.181, cost=5.27]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  4.92it/s, accuracy=0.198, cost=4.88]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 1, training avg loss 5.686522, training avg acc 0.124821\n",
      "epoch 1, testing avg loss 4.760657, testing avg acc 0.217537\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:42<00:00,  2.25it/s, accuracy=0.233, cost=4.57]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  4.95it/s, accuracy=0.232, cost=4.51]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 2, training avg loss 4.449081, training avg acc 0.246108\n",
      "epoch 2, testing avg loss 4.393114, testing avg acc 0.255664\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:48<00:00,  2.22it/s, accuracy=0.257, cost=4.11]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.07it/s, accuracy=0.243, cost=4.4] \n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 3, training avg loss 4.137654, training avg acc 0.272735\n",
      "epoch 3, testing avg loss 4.301171, testing avg acc 0.266582\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:42<00:00,  2.25it/s, accuracy=0.296, cost=3.74]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.04it/s, accuracy=0.243, cost=4.36]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 4, training avg loss 3.963166, training avg acc 0.287237\n",
      "epoch 4, testing avg loss 4.259640, testing avg acc 0.270476\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:41<00:00,  2.26it/s, accuracy=0.332, cost=3.44]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.07it/s, accuracy=0.226, cost=4.38]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 5, training avg loss 3.842489, training avg acc 0.298378\n",
      "epoch 5, testing avg loss 4.245483, testing avg acc 0.271044\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:41<00:00,  2.26it/s, accuracy=0.376, cost=3.2] \n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.07it/s, accuracy=0.243, cost=4.37]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 6, training avg loss 3.752273, training avg acc 0.307067\n",
      "epoch 6, testing avg loss 4.243598, testing avg acc 0.272871\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:42<00:00,  2.25it/s, accuracy=0.391, cost=3.05]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.06it/s, accuracy=0.26, cost=4.32] \n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 7, training avg loss 3.684822, training avg acc 0.313716\n",
      "epoch 7, testing avg loss 4.248034, testing avg acc 0.274310\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:41<00:00,  2.26it/s, accuracy=0.401, cost=2.91]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.11it/s, accuracy=0.271, cost=4.39]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 8, training avg loss 3.630121, training avg acc 0.319397\n",
      "epoch 8, testing avg loss 4.255015, testing avg acc 0.275639\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:41<00:00,  2.26it/s, accuracy=0.409, cost=2.8] \n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.03it/s, accuracy=0.249, cost=4.42]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 9, training avg loss 3.584320, training avg acc 0.324207\n",
      "epoch 9, testing avg loss 4.275506, testing avg acc 0.273156\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:41<00:00,  2.26it/s, accuracy=0.418, cost=2.72]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.04it/s, accuracy=0.226, cost=4.47]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 10, training avg loss 3.545377, training avg acc 0.328460\n",
      "epoch 10, testing avg loss 4.291951, testing avg acc 0.272207\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:41<00:00,  2.26it/s, accuracy=0.437, cost=2.63]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.17it/s, accuracy=0.243, cost=4.5] \n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 11, training avg loss 3.511881, training avg acc 0.332146\n",
      "epoch 11, testing avg loss 4.302092, testing avg acc 0.273274\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:41<00:00,  2.26it/s, accuracy=0.437, cost=2.57]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.14it/s, accuracy=0.232, cost=4.59]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 12, training avg loss 3.481792, training avg acc 0.335483\n",
      "epoch 12, testing avg loss 4.318480, testing avg acc 0.273639\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:41<00:00,  2.26it/s, accuracy=0.459, cost=2.48]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.14it/s, accuracy=0.232, cost=4.64]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 13, training avg loss 3.455056, training avg acc 0.338488\n",
      "epoch 13, testing avg loss 4.331190, testing avg acc 0.272390\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:40<00:00,  2.26it/s, accuracy=0.476, cost=2.43]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.08it/s, accuracy=0.249, cost=4.59]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 14, training avg loss 3.431543, training avg acc 0.340914\n",
      "epoch 14, testing avg loss 4.331103, testing avg acc 0.275652\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:41<00:00,  2.26it/s, accuracy=0.479, cost=2.37]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.10it/s, accuracy=0.249, cost=4.51]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 15, training avg loss 3.408900, training avg acc 0.343475\n",
      "epoch 15, testing avg loss 4.339329, testing avg acc 0.275996\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:59<00:00,  2.17it/s, accuracy=0.498, cost=2.3] \n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.10it/s, accuracy=0.249, cost=4.59]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 16, training avg loss 3.389175, training avg acc 0.345687\n",
      "epoch 16, testing avg loss 4.344028, testing avg acc 0.277432\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:40<00:00,  2.26it/s, accuracy=0.51, cost=2.27] \n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.08it/s, accuracy=0.237, cost=4.57]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 17, training avg loss 3.372403, training avg acc 0.347897\n",
      "epoch 17, testing avg loss 4.351481, testing avg acc 0.276098\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:41<00:00,  2.26it/s, accuracy=0.512, cost=2.23]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.09it/s, accuracy=0.243, cost=4.59]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 18, training avg loss 3.356888, training avg acc 0.349398\n",
      "epoch 18, testing avg loss 4.361471, testing avg acc 0.273745\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:42<00:00,  2.25it/s, accuracy=0.516, cost=2.18]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.06it/s, accuracy=0.243, cost=4.54]\n",
      "minibatch loop:   0%|          | 0/1042 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 19, training avg loss 3.344068, training avg acc 0.350703\n",
      "epoch 19, testing avg loss 4.371127, testing avg acc 0.275323\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "minibatch loop: 100%|██████████| 1042/1042 [07:43<00:00,  2.25it/s, accuracy=0.523, cost=2.16]\n",
      "minibatch loop: 100%|██████████| 23/23 [00:04<00:00,  5.13it/s, accuracy=0.215, cost=4.65]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, training avg loss 3.332623, training avg acc 0.352094\n",
      "epoch 20, testing avg loss 4.389966, testing avg acc 0.274987\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "import tqdm\n",
    "\n",
    "for e in range(epoch):\n",
    "    pbar = tqdm.tqdm(\n",
    "        range(0, len(train_X), batch_size), desc = 'minibatch loop')\n",
    "    train_loss, train_acc, test_loss, test_acc = [], [], [], []\n",
    "    for i in pbar:\n",
    "        index = min(i + batch_size, len(train_X))\n",
    "        maxlen = max([len(s) for s in train_X[i : index] + train_Y[i : index]])\n",
    "        batch_x, seq_x = pad_sentence_batch(train_X[i : index], PAD)\n",
    "        batch_y, seq_y = pad_sentence_batch(train_Y[i : index], PAD)\n",
    "        feed = {model.X: batch_x,\n",
    "                model.Y: batch_y}\n",
    "        accuracy, loss, _ = sess.run([model.accuracy,model.cost,model.optimizer],\n",
    "                                    feed_dict = feed)\n",
    "        train_loss.append(loss)\n",
    "        train_acc.append(accuracy)\n",
    "        pbar.set_postfix(cost = loss, accuracy = accuracy)\n",
    "    \n",
    "    \n",
    "    pbar = tqdm.tqdm(\n",
    "        range(0, len(test_X), batch_size), desc = 'minibatch loop')\n",
    "    for i in pbar:\n",
    "        index = min(i + batch_size, len(test_X))\n",
    "        batch_x, seq_x = pad_sentence_batch(test_X[i : index], PAD)\n",
    "        batch_y, seq_y = pad_sentence_batch(test_Y[i : index], PAD)\n",
    "        feed = {model.X: batch_x,\n",
    "                model.Y: batch_y,}\n",
    "        accuracy, loss = sess.run([model.accuracy,model.cost],\n",
    "                                    feed_dict = feed)\n",
    "\n",
    "        test_loss.append(loss)\n",
    "        test_acc.append(accuracy)\n",
    "        pbar.set_postfix(cost = loss, accuracy = accuracy)\n",
    "    \n",
    "    print('epoch %d, training avg loss %f, training avg acc %f'%(e+1,\n",
    "                                                                 np.mean(train_loss),np.mean(train_acc)))\n",
    "    print('epoch %d, testing avg loss %f, testing avg acc %f'%(e+1,\n",
    "                                                              np.mean(test_loss),np.mean(test_acc)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "rev_dictionary_to = {int(k): v for k, v in rev_dictionary_to.items()}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20, 198)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_size = 20\n",
    "\n",
    "batch_x, seq_x = pad_sentence_batch(test_X[: test_size], PAD)\n",
    "batch_y, seq_y = pad_sentence_batch(test_Y[: test_size], PAD)\n",
    "feed = {model.X: batch_x}\n",
    "logits = sess.run(model.predicting_ids, feed_dict = feed)\n",
    "logits.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 predict: Làm sao tôi có thể làm gì ? \" \" Không \" . Tôi sẽ không bao giờ quên được . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \"\n",
      "0 actual: Làm sao tôi có thể trình bày trong <NUM> phút về sợi dây liên kết những người phụ nữ qua ba thế hệ , về việc làm thế nào những sợi dây mạnh mẽ đáng kinh ngạc ấy đã níu chặt lấy cuộc sống của một cô bé bốn tuổi co quắp với đứa em gái nhỏ của cô bé , với mẹ và bà trong suốt năm ngày đêm trên con thuyền nhỏ lênh đênh trên Biển Đông hơn <NUM> năm trước , những sợi dây liên kết đã níu lấy cuộc đời cô bé ấy và không bao giờ rời đi - - cô bé ấy giờ sống ở San Francisco và đang nói chuyện với các bạn hôm nay ?\n",
      "\n",
      "1 predict: Không phải là một câu hỏi . Một câu hỏi đơn giản : \" Tôi không thể làm được điều này . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết .\n",
      "1 actual: Câu chuyện này chưa kết thúc .\n",
      "\n",
      "2 predict: Đó là những con chồn meerkat đã nói , \" Tôi đã gặp Bonnie . Tôi đã làm việc này . Tôi có thể nói rằng , \" Tôi biết không phải là một câu hỏi đơn giản : \" Tôi không thể làm được điều này . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm\n",
      "2 actual: Nó là một trò chơi ghép hình vẫn đang được xếp .\n",
      "\n",
      "3 predict: Hãy để tôi giải thích điều này , tôi nghĩ rằng tôi có thể làm gì đó . \" Và tôi đã hỏi \" Bài học \" không \" . \" Tôi đã nghe nói \" Không \" . Tôi sẽ không bao giờ quên được . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế\n",
      "3 actual: Hãy để tôi kể cho các bạn về vài mảnh ghép nhé .\n",
      "\n",
      "4 predict: Hãy nghĩ về một vài ví dụ về những gì chúng ta biết . SS : Vâng , tôi không biết . Tôi không biết . \" Tôi đã nghe thấy tiếng nói của tôi . Tôi đã làm việc này . Tôi có thể nói rằng , \" Tôi biết không phải là một câu hỏi đơn giản : \" Tôi không thể làm được điều này . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi\n",
      "4 actual: Hãy tưởng tượng mảnh đầu tiên : một người đàn ông đốt cháy sự nghiệp cả đời mình .\n",
      "\n",
      "5 predict: Ông là một người phụ nữ , và tôi đã gặp một người trong phòng thí nghiệm , và tôi nghĩ rằng đó là một vấn đề nghiêm trọng . Một câu chuyện khác . Một câu chuyện khác . Tôi tin rằng vầng sáng tạo ra một cách vô ích . Tuy nhiên , trong một thời gian , một trong những điều mà tôi đã làm . Tôi đã không biết mình đang làm gì ? \" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
      "5 actual: Ông là nhà thơ , nhà viết kịch , một người mà cả cuộc đời chênh vênh trên tia hi vọng duy nhất rằng đất nước ông sẽ độc lập tự do .\n",
      "\n",
      "6 predict: Hãy tưởng tượng bạn có thể thấy rằng nó có thể làm được gì . Tôi sẽ không bao giờ quên được . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết\n",
      "6 actual: Hãy tưởng tượng ông , một người cộng sản tiến vào , đối diện sự thật rằng cả cuộc đời ông đã phí hoài .\n",
      "\n",
      "7 predict: Hãy bắt đầu với một câu hỏi . Một câu hỏi đơn giản : \" Bạn có thể làm gì ? \" \" Không \" . \" Tôi đã nghe nói \" Không \" . Tôi sẽ không bao giờ quên được . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không\n",
      "7 actual: Ngôn từ , qua bao năm tháng là bạn đồng hành với ông , giờ quay ra chế giễu ông .\n",
      "\n",
      "8 predict: Ông ấy bảo cô ấy . \" Và tôi đã nuông chiều . \" Tôi nghĩ đó là một câu hỏi đơn giản : \" Tôi không thể làm được điều này . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó .\n",
      "8 actual: Ông rút lui vào yên lặng .\n",
      "\n",
      "9 predict: Anh ta gọi nó là \" hail \" , và tôi sẽ không bao giờ quên được . \" Tôi sẽ nói \" Tôi đã nghe thấy \" Không \" . \" Tôi đã nghe nói \" Không \" . Tôi sẽ không bao giờ quên được . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm\n",
      "9 actual: Ông qua đời , bị lịch sử quật ngã .\n",
      "\n",
      "10 predict: Ông ta không biết . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không\n",
      "10 actual: Ông là ông của tôi .\n",
      "\n",
      "11 predict: Tôi sẽ không bao giờ quên được . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế .\n",
      "11 actual: Tôi chưa bao giờ gặp ông ngoài đời .\n",
      "\n",
      "12 predict: Nhưng những người khác cũng có thể làm được điều này . \" Tôi không biết . Tôi không biết . \" Tôi đã nghe thấy tiếng nói của tôi . Tôi đã làm việc này . Tôi có thể nói rằng , \" Tôi biết không phải là một câu hỏi đơn giản : \" Tôi không thể làm được điều này . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \"\n",
      "12 actual: Nhưng cuộc đời ta nhiều hơn những gì ta lưu trong kí ức nhiều .\n",
      "\n",
      "13 predict: Mong muốn là gì ? \" \" Không \" . \" Tôi đã nghe nói về nó . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe\n",
      "13 actual: Bà tôi chưa bao giờ cho phép tôi quên cuộc đời của ông .\n",
      "\n",
      "14 predict: Kinh tế của tôi không phải là vấn đề . \" PM : \" Tôi có thể nói rằng , \" Tôi biết rõ ràng rồi , \" Tôi xin lỗi . Tôi không biết . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói\n",
      "14 actual: Nhiệm vụ của tôi là không để cuộc đời ấy qua trong vô vọng , và bài học của tôi là nhận ra rằng , vâng , lịch sử đã cố quật ngã chúng tôi , nhưng chúng tôi đã chịu đựng được .\n",
      "\n",
      "15 predict: Sự quấy rối về cơ bản là một ví dụ . Một lần nữa , nó sẽ đi qua lại . \" Và chúng tôi đã nói rằng , \" Tôi biết không phải là một câu hỏi đơn giản : \" Tôi không thể làm được điều này . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi\n",
      "15 actual: Mảnh ghép tiếp theo của tấm hình là một con thuyền trong sớm hoàng hôn lặng lẽ trườn ra biển .\n",
      "\n",
      "16 predict: Mẹ tôi , một người phụ nữ , và tôi đã gặp nhau . Tôi đã làm việc này . Tôi không thể làm được . \" Tôi sẽ nói , \" Tôi biết rằng tôi không thể làm được . \" Tôi sẽ nói \" Vâng ! \" . \" Tôi đã nuông chiều \" . \" Tôi sẽ nói \" Không ! \" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n",
      "16 actual: Mẹ tôi , Mai , mới <NUM> tuổi khi ba của mẹ mất - - đã lập gia đình , một cuộc hôn nhân sắp đặt trước , đã có hai cô con gái nhỏ .\n",
      "\n",
      "17 predict: Đối với những người phụ nữ này , tôi đã gặp một người trong phòng thí nghiệm , và tôi nghĩ rằng đó là một vấn đề nghiêm trọng . Một câu chuyện khác . Một câu chuyện khác . Tôi tin rằng vầng sáng tạo ra một cách vô ích . Tuy nhiên , trong một thời gian , một trong những điều mà tôi đã làm . Tôi đã không biết mình đang làm gì ? \" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .\n",
      "17 actual: Với mẹ , cuộc đời cô đọng vào nhiệm vụ duy nhất : để gia đình mẹ trốn thoát và bắt đầu cuộc sống mới ở Úc .\n",
      "\n",
      "18 predict: Nó gọi là \" Sự thiếu hiểu biết trongkhoảng . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm thế . \" Tôi không biết . \" Tôi đã nghe nói về nó . \" Tôi đã làm\n",
      "18 actual: Mẹ không bao giờ chấp nhận được là mẹ sẽ không thành công .\n",
      "\n",
      "19 predict: Sau <NUM> năm , chúng tôi đã có thể làm được điều này . Tôi sẽ không bao giờ quên được nữa . \" Tôi sẽ nói \" Vâng ! \" . \" Tôi đã nuông chiều \" . \" Tôi sẽ nói \" Không ! \" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n",
      "19 actual: Thế là sau bốn năm , một trường thiên đằng đẵng hơn cả trong truyện , một chiếc thuyền trườn ra biển nguỵ trang là thuyền đánh cá .\n",
      "\n"
     ]
    }
   ],
   "source": [
    "rejected = ['PAD', 'EOS', 'UNK', 'GO']\n",
    "\n",
    "for i in range(test_size):\n",
    "    predict = [rev_dictionary_to[i] for i in logits[i] if rev_dictionary_to[i] not in rejected]\n",
    "    actual = [rev_dictionary_to[i] for i in batch_y[i] if rev_dictionary_to[i] not in rejected]\n",
    "    print(i, 'predict:', ' '.join(predict))\n",
    "    print(i, 'actual:', ' '.join(actual))\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
